package lily.ui.bookshelf;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import android.util.AttributeSet;
import android.util.Log;
import android.content.Context;
import android.database.Cursor;
import android.net.Uri;
import android.widget.GridView;

public class ShelfView extends GridView {
	
	private Context mContext;
	private ShelfAdapter adapter;
	private List<Map<String, Object>> list;//保存全部档案
	private List<Map<String, Object>> displayList;//需要显示的档案（50）
	private static int fileSum = 0;//数据库中的档案总数
	private static int pages = 1;//总页数
	private static int index = 1;//当前页数
	
	public ShelfView(Context context) {
		super(context);
		// TODO Auto-generated constructor stub
		this.mContext = context;
		init();
		
	}
	
	public ShelfView(Context context, AttributeSet attrs) {
		super(context, attrs);
		// TODO Auto-generated constructor stub
		this.mContext = context;
		init();
	}
	
	private void init() {
		// TODO Auto-generated method stub
		this.setColumnWidth(155);
		this.setStretchMode(STRETCH_COLUMN_WIDTH);
		this.setNumColumns(5);
		
		list = new ArrayList<Map<String, Object>>();
		displayList = new ArrayList<Map<String, Object>>();
		adapter = new ShelfAdapter(mContext, displayList);
		this.setAdapter(adapter);
		
	}

//	/**
//	 * 仅测试时使用！
//	 */
//	public int loadData(){
//		list.clear();
//		for(int i=1;i<=50;i++){
//			Map<String, Object> item = new HashMap<String, Object>();
//			item.put("item_name", "name"+i);
//			item.put("item_id", i);
//			list.add(item);
//			
//		}
//		
//		return list.size();
//	}
	
	/**
	 * 从Uri中读取数据,注意projection的格式，只取出档案名称和编号就可以
	 * @note 数据存储在list中，此后的操作只针对list链表，可以加快速度
	 * @param uri 数据库中对表或者视图
	 * @param projection {id,name}
	 * @param selection 筛选条件
	 * @return 数据的记录数
	 */
	public int loadData(final Uri uri,final String[] projection, final String selection){
		
		Cursor cursor = mContext.getContentResolver().query(uri, projection, selection, null, null);
		fileSum = cursor.getCount();
		pages = (fileSum-1)/50 + 1;
		while(cursor.moveToNext()){
			Map<String, Object> item = new HashMap<String, Object>();
			item.put("item_here_id", cursor.getString(0));//显示的编号
			item.put("item_id", cursor.getInt(1));//系统内部使用
			item.put("item_name", cursor.getString(2));
			list.add(item);
		}
		cursor.close();
		loadPage();//初始时加载第一页
		return list.size();
	}
	
	/**
	 * 加载当前页index，每页50个数据（2屏）fileList
	 */
	public void loadPage(){
		Log.i("shelf", "load index="+index);
		if(index>0&&index<=pages){
			displayList.clear();
			
			int start = 50*(index-1);
			int end = Math.min(50*index, fileSum);
			Log.i("shelf", "fileSum="+fileSum);
			Log.i("shelf", "list.size()="+list.size());
			Log.i("shelf", "start="+start);
			Log.i("shelf", "end="+end);
			
			//只遍历需要的部分，并转移至displayList
			//不能直接使用sublist，因为对sublist的操作会影响初始list的结构
			
			List<Map<String, Object>> templist = list.subList(start, end);
			for(Map<String, Object> item:templist){
				displayList.add(item);
			}
		}
	}
	
	/**
	 * 加载下一页
	 */
	public void loadNextPage(){
		index++;
		loadPage();
	}
	
	/**
	 * 加载上一页
	 */
	public void loadLastPage(){
		index--;
		loadPage();
	}
	
	/**
	 * 退出书架页面时清理缓存，防止内存溢出
	 */
	public void close(){
		Log.i("shelf", "closed");
		list.clear();
		displayList.clear();
	}
	
	/**
	 * 刷新界面
	 */
	public void refresh(){
		adapter = new ShelfAdapter(mContext, displayList);
//		Log.i("shelf", "refresh adapter "+adapter.getCount());
		this.setAdapter(adapter);
	}
	
	/**
	 * @return 当前的档案总数
	 */
	public int getFileSum(){
		return fileSum;
	}
	
	/**
	 * @return 总页数
	 */
	public int getPages(){
		return pages;
	}
	
	/**
	 * @return 当前的页码
	 */
	public int getIndex(){
		return index;
	}
	
	/**
	 * 设置当前要查询的页码，有越界检查：不合法，不接受新的页码，保留原值
	 * @param p 页码
	 */
	public void setIndex(int p){
		if(p<1||p>pages){
			Log.e("shelf", "search page invalid");
		}
		else{
			index = p;
		}
	}
	
	/**
	 * 在书架末尾添加新的档案，并将有关信息填入数据库
	 * @since 该档案未提交至服务器，显示档案编号为：暂未给定
	 * @param name 档案名称
	 * @param id 档案编号，内部使用
	 */
	public void addFileToLast(String name,int id){
		Map<String, Object> item = new HashMap<String, Object>();
		item.put("item_here_id", "暂未给定");
		item.put("item_id", id);
		item.put("item_name", name);
		list.add(item);
		fileSum++;
		pages = fileSum/50 + 1;
		//显示最后一页
		index = pages;
		loadPage();
	}
	
	/**
	 * 在书架末尾添加新的档案，并将有关信息填入数据库
	 * @since 该档案已经提交至服务器
	 * @param name 档案名称
	 * @param id 档案编号，内部使用
	 * @param here_id 显示的档案编号
	 */
	public void addFileToLast(String name,int id,String here_id){
		Map<String, Object> item = new HashMap<String, Object>();
		item.put("item_here_id", here_id);
		item.put("item_id", id);
		item.put("item_name", name);
		list.add(item);
		fileSum++;
		pages = fileSum/50 + 1;
		//显示最后一页
		index = pages;
		loadPage();
	}
	
	/**
	 * 删除档案，本地档案
	 * @param id 档案编号
	 */
	public void deleteFile(String name,int id){
		Map<String, Object> item = new HashMap<String, Object>();
		item.put("item_here_id", "暂未给定");
		item.put("item_id", id);
		item.put("item_name", name);
		Log.i("shelf", "delete file "+list.indexOf(item));
		list.remove(item);
		fileSum--;
		pages = fileSum/50 + 1;
		//显示当前页,需要考虑因删除档案引起的页码变化
		if(index>pages){
			//当前页中只有一个档案，删除后本页没有档案，故显示前一页
			index--;
		}
		
		loadPage();
	}
	
	/**
	 * 删除档案,本档案存在服务器上，需考虑同步问题
	 * @param name 档案名词
	 * @param id 内部使用的档案编号
	 * @param here_id 显示的档案编号
	 */
	public void deleteFile(String name,int id, String here_id){
		Map<String, Object> item = new HashMap<String, Object>();
		item.put("item_here_id", "暂未给定");
		item.put("item_id", id);
		item.put("item_name", name);
		Log.i("shelf", "delete file "+list.indexOf(item));
		list.remove(item);
		fileSum--;
		pages = fileSum/50 + 1;
		//显示当前页,需要考虑因删除档案引起的页码变化
		if(index>pages){
			//当前页中只有一个档案，删除后本页没有档案，故显示前一页
			index--;
		}
		
		loadPage();
	}

}
